package demo1;

public class 位运算01 {
    public static void main(String[] args) {
        //说明：因为int占4个字节，所以这里有4个8位
        //      2的原码:00000000 00000000 00000000 000000010
        //      3的原码:00000000 00000000 00000000 000000011
        //      3的补码:00000000 00000000 00000000 000000011
        //      2的补码:00000000 00000000 00000000 000000010
        //      按位或 得到2|3运算后的补码
        //             00000000 00000000 00000000 000000011 (按位或 得到2|3运算后的补码)
        //      因为补码是正数，所以补码也是原码
        System.out.println(2|3);//按位或，得到3
        //      3的补码:00000000 00000000 00000000 000000011
        //      2的补码:00000000 00000000 00000000 000000010
        //      按位异或 得到2^3运算后的补码
        //              00000000 00000000 00000000 000000001 （按位异或 得到2^3运算后的补码）
        //      因为补码是正数，所以补码也是原码
        System.out.println(2^3);//按位异或，得到1
        //2的补码: 00000000 00000000 00000000 000000010
        //补码取反：11111111 11111111 11111111 11111101  取反后的补码
        //反码为补码-1：11111111 11111111 11111111 11111100
        //原码：        10000000 00000000 00000000 00000011
        System.out.println(~2);//按位取反,得到-3
        //      3的补码:00000000 00000000 00000000 000000011
        //      2的补码:00000000 00000000 00000000 000000010
        //      按位与 得到2&3运算后的补码
        //             00000000 00000000 00000000 000000010
        //      因为补码是正数，所以补码也是原码
        System.out.println(2&3);//按位与,得到2
        //      -5的原码：10000000 00000000 00000000 00000101
        //      -5的反码：11111111 11111111 11111111 11111010
        //      -5的补码：11111111 11111111 11111111 11111011
        //      -5的补码按位取反：
        //      00000000 00000000 00000000 00000100
        //      嘿嘿，正数补码也是原码
        System.out.println(~-5);//按位取反，得到4
        //      13的补码：00000000 00000000 00000000 00001101
        //      7的补码：00000000 00000000 00000000 00000111
        //按位与补码：00000000 00000000 00000000 00000101 （正数的话也是原码)
        System.out.println(13&7);//按位与,得到5
        //      5的补码：00000000 00000000 00000000 00000101
        //      4的补码：00000000 00000000 00000000 00000100
        //      按位或补码：00000000 00000000 00000000 00000101 (正数的话也是原码)
        System.out.println(5|4);//按位或,得到5

        //      -3的原码：10000000 00000000 00000000 00000011
        //      -3的反码：11111111 11111111 11111111 11111100
        //      -3的补码：11111111 11111111 11111111 11111101
        //       3的补码: 00000000 00000000 00000000 000000011
        //按位异或补码   :11111111 11111111 11111111 11111110
        //运算后反码：   11111111 11111111 11111111 11111101
        //运算后原码：   10000000 00000000 00000000 00000010
        System.out.println(-3^3);//按位异或，得到2
    }
}
